from PyQt5 import QtCore,  QtWidgets
from PyQt5.QtWidgets import QTableWidgetItem, QMessageBox, QInputDialog, QFileDialog
import csv
import os
import shutil
from projectinfo.proj import Ui_proj_MainWindow
from projectinfo.projinfo_logic import projinfo_window
from database import usedb

class proj_window(Ui_proj_MainWindow):
    def __init__(self):
        super(proj_window, self).__init__()
        # 只显示关闭按钮
        self.setWindowFlags(QtCore.Qt.WindowCloseButtonHint)
        self.setupUi(self)
        self.show()
        # 为取消按钮的clicked信号绑定自定义槽函数
        self.pbtn_quit.clicked.connect(self.quit)
        # 为OK按钮的clicked信号绑定自定义槽函数
        self.pbtn_OK.clicked.connect(self.OK)
        # 获取选中的单元格数据
        self.tbw_info.itemClicked.connect(self.getitem)
    def quit(self):
        # 点击取消按钮，用户管理窗口关闭
        self.close()

    # 点击OK按钮，完成新建、打开和删除操作
    def OK(self):
        if self.pbtn_OK.text() == "新建":  # 执行新建项目操作
            self.new_proj()
        elif self.pbtn_OK.text() == "打开":  # 执行打开项目操作，在projinfo窗体显示该项目汇总信息
            self.open_proj()
        elif self.pbtn_OK.text() == "删除":  # 执行删除项目函数
            self.delete_proj()
        else:
            QMessageBox.warning(None, '警告', '出现错误，请仔细检查！', QMessageBox.Ok)

    # 新建项目函数
    def get_projname(self):
        # 获得项目名称函数
        # 输入不为空，则返回项目名称，否则报错并返回0
        proj, flag = QInputDialog.getText(None, "项目名称", "请输入项目名称", QtWidgets.QLineEdit.Normal)
        if proj != '':
            return proj
        else:
            QMessageBox.information(None, '提示', '请重新输入项目名称!', QMessageBox.Ok)
            return ''

    def get_path(self):
        # 获得项目路径函数
        # 获得项目路径函数
        path = QFileDialog.getExistingDirectory(None, "选择项目文件夹路径", os.getcwd(), QFileDialog.ShowDirsOnly)
        if path != '' :
            return path
        else:
            QMessageBox.warning(None, 'no directory', 'please choose a directory', QMessageBox.Ok)
            return ''
    def getitem(self, item):
        # 获取选中的表格内容
        if item.column() == 1:  # 如果点击的是第二列==项目名称列
            self.select = item.text()

    def new_proj(self):
        #新建项目
        usedb.cur_path = self.get_path()
        usedb.cur_proj = self.get_projname()
        if usedb.cur_proj != '' or usedb.cur_path != '':
            if os.path.exists(usedb.cur_path) and usedb.getproj(usedb.cur_proj) == 0:
                #项目路径存在且项目名称不在数据库中
                #proj和path都存在(path在电脑中存在，否则会导致虽然数据库有路径，但是路径不存在）。
                result1 = usedb.query("select * from projinfo")
                import datetime
                d = datetime.date.today()
                newdate = d.strftime('%Y-%m-%d')
                # 1、 向table projinfo 添加项目信息
                dir_proj = os.path.join(usedb.cur_path, usedb.cur_proj)
                csv_projinfo = os.path.join(dir_proj, f'{usedb.cur_proj}综合质量评分（表一）.csv')
                csv_piletotal = os.path.join(dir_proj, f'{usedb.cur_proj}汇总信息表（表二）.csv')
                csv_pile = os.path.join(dir_proj, f'{usedb.cur_proj}试验成果及得分表（表三）.csv')
                dir_images = os.path.join(dir_proj, 'images')
                result2 = usedb.exec(
                    "insert into projinfo(id,proj,newdate,qualified,unqualified,total,path) values (?,?,?,?,?,?,?)",
                    (len(result1) + 1, usedb.cur_proj, newdate, 0, 0, 0, usedb.cur_path))
                # 2、在path下新建“项目名称”命名的文件夹，项目名称.CSV文件，项目名称.Jason文件和images文件夹。
                if result2 > 0 and os.path.exists(dir_proj)==False and os.path.exists(dir_images)==False:
                    # 数据库添加结果不为0，说明执行成功。
                    #项目文件夹不存在，images文件夹也不不存在
                    self.query_proj()
                    os.mkdir(dir_proj)
                    os.mkdir(dir_images)
                    with open(csv_projinfo, 'w', newline='',encoding='utf-8') as csvfile:
                        csvinput = csv.writer(csvfile)
                        projinfohead = (
                            '序号', '桩号', '里程号', '施工桩长', '实测桩长', '龄期', '上部', '下部', '综合',
                            '综合质量等级'
                        )
                        csvinput.writerow(projinfohead)
                        csvfile.close()
                    with open(csv_piletotal, 'w', newline='',encoding='utf-8') as csvfile:
                        csvinput = csv.writer(csvfile)
                        projinfohead = (
                            '序号', '桩号', '里程号', '施工掺灰量','施工日期','检测日期','龄期（天）','施工桩长m',
                            '实测桩长m','标贯个数','室内试验（组）'
                        )
                        csvinput.writerow(projinfohead)
                        csvfile.close()
                    with open(csv_pile, 'w', newline='',encoding='utf-8') as csvfile:
                        csvinput = csv.writer(csvfile)
                        pilehead = (
                            '序号', '桩号', '里程号', '龄期', '深度（m）', '硬度状态', '得分', '标贯击数',
                            '杆长折算击数',
                            '龄期折算击数', '得分', '强度（MPa）', '折算强度（MPa）', '得分', '每层得分', '上下得分',
                            '综合得分', '综合评定'
                        )
                        csvinput.writerow(pilehead)
                        csvfile.close()
                    QMessageBox.information(None, '提示', f'项目[{usedb.cur_proj}]位于[{usedb.cur_path}]添加成功!',
                                        QMessageBox.Ok)
                else:
                    QMessageBox.information(None, '提示', "项目添加失败！",QMessageBox.Ok)

            elif usedb.getproj(usedb.cur_proj) > 0:
                # 返回值>0，代表proj数据库中已有这个项目名称
                QMessageBox.information(None, '提示', '您要添加的项目名称已经存在，请重新输入!', QMessageBox.Ok)
            else:
                QMessageBox.information(None, '提示', '请重新输入项目名称或项目路径!', QMessageBox.Ok)
        else:
            QMessageBox.information(None, '提示', '未输入项目路径或项目名称!', QMessageBox.Ok)


    def open_proj(self):
        #打开项目
        try:
            if self.select!='':
                result = usedb.query("select * from projinfo where proj = ?", self.select)
                if result != 0:  # 数据库projinfo中存在该项目，显示projinfo窗体。
                    usedb.cur_proj = result[0][1]
                    usedb.cur_path = result[0][6]
                    self.close()
                    self.projinfowin= projinfo_window() # 创建projinfo窗体对象
        except:
            QMessageBox.warning(None, '警告', '未知错误！', QMessageBox.Ok)
    def delete_proj(self):
        # 删除项目
        choose = QMessageBox.warning(None, '警告', '本操作将删除项目！', QMessageBox.Yes | QMessageBox.No)
        if choose == QMessageBox.Yes:
            try:
                if self.select != "":
                    result = usedb.query("select * from projinfo where proj = ?", self.select)
                    if result!=0:  # 数据库projinfo中存在该项目，判断该项目文件夹是否存在，存在就删除。并讲两个全局变量清空。
                        usedb.cur_proj = result[0][1]
                        usedb.cur_path = result[0][6]
                        dir_proj = os.path.join(usedb.cur_path, usedb.cur_proj)
                        usedb.exec("delete from projinfo where proj = ?", (self.select,))

                        if os.path.exists(dir_proj):
                            shutil.rmtree(dir_proj)
                        else:
                            QMessageBox.information(None, '提示', '该项目文件夹不存在，仍将删除该项目！', QMessageBox.Ok)
                        usedb.cur_proj = ''
                        usedb.cur_path = ''
                        #重写主键，防止再次新建时，因为主键重复，导致添加失败
                        result1 = usedb.query("select id from projinfo ")
                        if result1 != 0:
                            for i in range(len(result1)):
                                usedb.exec("update projinfo set id = ? where id =?", (i+1,result1[i][0]))
                        QMessageBox.information(None, '提示', '删除成功！', QMessageBox.Ok)
                        self.query_proj()
            except:
                QMessageBox.warning(None, '警告', '请选择项目名称！', QMessageBox.Ok)
        elif choose==QMessageBox.No:
            QMessageBox.information(None, '提示', '取消删除项目！', QMessageBox.Ok)

    def query_proj(self):
        # 查询项目信息，并显示在表格中
        self.tbw_info.setRowCount(0)
        # 调用usedb中的query方法执行查询语句
        result = usedb.query("select * from projinfo")
        row = len(result)
        # id proj newdate qualified unqualified total path
        col = 7
        self.tbw_info.setRowCount(row)
        self.tbw_info.setColumnCount(col)
        # 设置表格标题
        self.tbw_info.setHorizontalHeaderLabels(['编号', '项目名称', '日期', '合格', '不合格', '总数', '项目路径'])
        self.tbw_info.verticalHeader().setVisible(False)
        for i in range(row):
            for j in range(col):
                data = QTableWidgetItem(str(result[i][j]))
                data.setTextAlignment(QtCore.Qt.AlignCenter)
                self.tbw_info.setItem(i, j, data)
        self.tbw_info.resizeColumnsToContents()
        self.tbw_info.setAlternatingRowColors(True)
        self.tbw_info.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
        self.tbw_info.horizontalHeader().setStretchLastSection(True)
        self.tbw_info.setShowGrid(True)

